package com.blackhorse.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class OrderServiceImpl3 {

    /**
     * SentinelResource注解用于定义sentinel保护的资源，资源可以是一个服务，一个接口、一个方法、或者一段代码
     * value属性是资源名
     * blockHandler指定当资源内部发生BlockException时应该执行的方法名
     * fallback指定当资源内部发生Throwable时应该执行的方法名
     */
    @SentinelResource(
        value = "message",
        blockHandler = "messageBlocked", //blockHandler方法必须与原方法参数列表和返回类型一致，但是blockHandler方法最后可以加一个BlockException参数
        fallback = "messageFallback", //fallback方法同上，注意最后一个参数是Throwable；当异常同时满足blockHandler和fallback时，优先执行blockHandler
        blockHandlerClass = OrderServiceImpl3BlockHandler.class, //单独写类时，使用blockHandlerClass/fallbackClass指定
        fallbackClass = OrderServiceImpl3BlockHandler.class
    )
    public String message() {
        //模拟随机1/4概率出现异常
        int a = (int) (Math.random() + 0.75);
        int b = 1 / a;
        return "message";
    }

    /*
    //以下两个方法移动到OrderServiceImpl3BlockHandler

    public String messageBlocked(BlockException e) {
        //自定义异常处理逻辑
        log.error("发生了BlockException，内容为：", e);
        return "messageBlocked";
    }

    public String messageFallback(Throwable e) {
        //自定义异常处理逻辑
        log.error("发生了Throwable，内容为：", e);
        return "messageFallback";
    }

     */
}
